package com.xbongbong.sys.model;

import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.IModel;
import com.xbongbong.pro.domain.entity.FineClueUserEntity;
import com.xbongbong.sys.domain.entity.CompanyEntity;
import com.xbongbong.sys.domain.entity.FeeCompanyEntity;

import java.util.List;
import java.util.Map;

/**
 * 套餐逻辑接口
 * @author kaka
 * @time 2018-8-28 16:16
 */
public interface FeeCompanyModel extends IModel<FeeCompanyEntity> {

    /**
     * Description: 插入FeeCompanyEntity,有业务逻辑
     * @param entity FeeCompanyEntity
     * @return java.lang.Integer
     * @throws XbbException XbbException
     * @author 魏荣杰
     * @date 2019/2/15 10:36
     * @since v1.0
     */
    @Override
    Integer insert(FeeCompanyEntity entity) throws XbbException;

    /**
     * Description: 更新FeeCompanyEntity,有业务逻辑
     * @param entity FeeCompanyEntity
     * @return java.lang.Integer
     * @throws XbbException XbbException
     * @author 魏荣杰
     * @date 2019/2/15 10:38
     * @since v1.0
     */
    @Override
    Integer update(FeeCompanyEntity entity) throws XbbException;

  /**
   * 批量更新 mainCorpid字段
   * @param list
   * @param corpid
   * @return
   */
  Integer updateBatch(List<FeeCompanyEntity> list, String corpid);
   /**
    * Description: 根据查询条件 进行查询
    * @param param 查询参数
    * @return java.util.List
    * @author 魏荣杰
    * @date 2019/2/19 13:38
    * @since v1.0
    */
    @Override
    List<FeeCompanyEntity> findEntitys(Map<String, Object> param);
    /**
     * Description: 根据查询参数 获取数量
     * @param param 查询参数
     * @return java.lang.Integer
     * @author 魏荣杰
     * @date 2019/2/19 13:40
     * @since v1.0
     */
    @Override
    Integer getEntitysCount(Map<String, Object> param);

    /**
     * feeCompanyModel timeCondition其中一类，表示包含后续时间点，
     * 即 startTime <= timeStamp && endTime >= timeStamp
     */
    String TIME_BETWEEN = "timeBetween";

    /**
     * feeCompanyModel timeCondition其中一类，即当前有效及历史的套餐
     * 即 start <= timeStamp
     */
    String START_TIME_LT = "startTimeLt";

    /**
     * 获取某公司包含某个时间点/当前有效及历史的套餐,
     * 即某公司符合
     * 1.若timeCondition = "timeBetween" 包含该时间点 startTime <= timeStamp && endTime >= timeStamp;
     * 若timeCondition = "startTimeLt" 表示 start <= timeStamp 即当前有效及历史的套餐
     * 2.有效 isActive = 1
     * 3.若符合条件有多条记录，则取套餐结束时间(endTime)最晚的记录
     * 的套餐记录
     * @param corpid 公司id
     * @param timeCondition 时间条件
     *                      timeBetween：表示包含timeStamp,即startTime <= timeStamp && endTime >= timeStamp
     *                      startTimeLt：表示start <= timeStamp
     * @param timeStamp 用于判断的时间戳
     * @return 返回符合条件的套餐
     */
    FeeCompanyEntity getActiveFeeCompany(String corpid, String timeCondition, Integer timeStamp);

    /**
     * 获取某公司包含当前及历史的有效套餐记录,
     * 即某公司符合
     * 1.startTime <= nowTimeStamp
     * 2.有效 isActive = 1
     * 3.若符合条件有多条记录，则取套餐结束时间(endTime)最晚的记录
     * 的套餐记录
     * @param corpid 公司id
     * @return 返回符合条件的套餐
     */
    FeeCompanyEntity getHistoryActiveFeeCompany(String corpid);

    /**
     * 获取公司购买次数
     * @param corpid 公司id
     * 创建时间： 2018年7月20日 上午9:28:34
     * 修改时间： 2018年7月20日 上午9:28:34 chy
     * @author chy
     * @since v3.26
     * @version v3.26
     */
    Integer getBuyNum(String corpid);
    /**
     * Description: 保存公司套餐，直接保存没特殊逻辑，需要与业务相关的请用FeeCompanyService的save，insert，update等方法
     * @param entity FeeCompanyEntity
     * @return java.lang.Integer
     * @throws XbbException  XbbException
     * @author 魏荣杰
     * @date 2019/2/15 10:26
     * @since v1.0
     */
    Integer save(FeeCompanyEntity entity) throws XbbException;

    /**
     * 当前所有的付费套餐不可用
     * @param corpid
     * 创建时间 2020/10/10 4:22 PM
     * 修改时间 2020/10/10 4:22 PM
     * @author chy
     */
    void paidPackageUnavailable(String corpid);

    /**
     * Description: 根据主键删除
     * @param key id
     * @return java.lang.Integer
     * @author 魏荣杰
     * @date 2019/2/15 10:31
     * @since v1.0
     */
    Integer deleteByKey(Integer key);
    /**
     * Description: 根据主键获取
     * @param key id
     * @return com.xbongbong.sys.domain.entity.FeeCompanyEntity
     * @author 魏荣杰
     * @date 2019/2/15 10:32
     * @since v1.0
     */
    FeeCompanyEntity getByKey(Integer key);

    /**
     * 获取公司第一条套餐付费记录
     * @param corpid 公司id
     * @return
     * 创建时间： 2018-6-12 上午11:22:18
     * 修改时间： 2018-6-12 上午11:22:18 chy
     * @author chy
     * @since v3.23
     */
    FeeCompanyEntity getFirstFeeCompany(String corpid);
    /**
    * 获取公司第一条套餐记录(忽略isPay字段)
    * @param corpid 公司id
    * @return
    * 创建时间： 2021-12-31 上午11:22:18
    * 修改时间： 2021-12-31 上午11:22:18 rsc
    * @author rsc
    * @since v3.23
    */
    FeeCompanyEntity getFirstFeeCompanyIgnoreIsPay(String corpid);
     /**
     * 获取公司最后套餐付费记录
     * @param corpid 公司id
     * @return
     * 创建时间： 2018-6-12 上午11:22:18
     * 修改时间： 2018-6-12 上午11:22:18 chy
     * @author chy
     * @since v3.23
     */
    FeeCompanyEntity getLastFeeCompany(String corpid);
    /**
     * 获取公司最后套餐付费记录(忽略isPay字段)
     * @param corpid 公司id
     * @return
     * 创建时间： 2018-6-12 上午11:22:18
     * 修改时间： 2018-6-12 上午11:22:18 chy
     * @author chy
     * @since v3.23
     */
    FeeCompanyEntity getLastFeeCompanyIgnoreIsPay(String corpid);

    /**
     * 获取订单类型
     * @param payFee 支付金额
     * @param nowUserNum 当前套餐人数
     * @param nowEndTime 当前结束时间
     * @param corpid 公司id
     * @param isDingdingCallBack 是否钉钉回调
     * @return
     * 创建时间： 2018-6-11 下午8:04:03
     * 修改时间： 2018-6-11 下午8:04:03 chy
     * @author chy
     * @since v3.23
     * @version v3.23
     */
    Integer getOrderType(Float payFee, Integer nowUserNum, Long nowEndTime, String corpid, boolean isDingdingCallBack);

    /**
     * 获取当前有效的套餐，优先返回旗舰版套餐，再优先人数多的套餐
     * @param corpid
     * @return
     * 创建时间 2019/6/27 8:07 PM
     * 修改时间 2019/6/27 8:07 PM
     * @author chy
     * @since v1.0
     * @version v1.0
     */
    FeeCompanyEntity getNowFeeCompany(String corpid);

    /**
     * 获取当前有效的付费套餐，成功部需要的功能
     * 1、获取套餐：是否支付=是，是否生效=是，截止日期>当前时间（有效的付费套餐）
     * 2、获取1结果中的截止时间最晚的付费套餐
     * 3、若2的结果为多条，取套餐人数最多的套餐
     * 4、若3的结果为多条，取套餐版本最高的套餐
     * 5、若以上逻辑执行完，没有套餐，取结束时间最近的一条付费套餐记录
     * 6、若以上逻辑执行完，没有套餐，返回空
     * @param corpid
     * @return
     * 创建时间 2019/6/27 8:07 PM
     * 修改时间 2019/6/27 8:07 PM
     * @author chy
     * @since v1.0
     * @version v1.0
     */
    FeeCompanyEntity getCSMFeeCompany(String corpid);


    /**
     * 通过公司和套餐类型查找相关套餐
     * @param corpid
     * @param feeType
     * @return java.util.List<com.xbongbong.sys.domain.entity.FeeCompanyEntity>
     * @author 石安
     * @date 2020-01-06
     */
    List<FeeCompanyEntity> getByType(String corpid, int feeType);

    /**
     * 获取该公司的所有套餐
     * @param corpid
     * @param feeNameLike
     * @return java.util.List<com.xbongbong.sys.domain.entity.FeeCompanyEntity>
     * @author 石安
     * @date 2020-01-14
     */
    List<FeeCompanyEntity> getListByCorpid(String corpid, String feeNameLike);

    /**
     * 将套餐信息设置到公司中
     * 获取当前有效的所有套餐
     * 套餐开始时间：所有套餐中最小的开始时间
     * 套餐结束时间：所有套餐中最大的结束时间
     * 套餐名：第一个feeType最大的套餐名
     * feeType：所有套餐中最大的feeType
     * userNum：所有套餐中最大的userNum
     * orderType：更新时间最大的orderType
     * @param company
     * 创建时间 2020/5/25 9:21 AM
     * 修改时间 2020/5/25 9:21 AM
     * @author chy
     */
    void setFeeCompanyInfo4Company(CompanyEntity company) throws XbbException;
}
